/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Ventas.Controlador;

import CharliesCookies.MainController;
import com.dp1.pucp.Modelo.Clases.Documentoventa;
import com.dp1.pucp.Modelo.Clases.Kardex;
import com.dp1.pucp.Modelo.Clases.Lineapedidoproducto;
import com.dp1.pucp.Modelo.Clases.Pedidoproducto;
import com.dp1.pucp.Modelo.Clases.Presentacion;
import com.dp1.pucp.Modelo.Clases.Productofinal;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import com.dp1.pucp.Seguridad.DAO.LogDAO;
import com.dp1.pucp.Simulacion.VIsta.MantPlanProdGUI2;
import com.dp1.pucp.Util.Validaciones;
import com.dp1.pucp.Ventas.DAO.DocVentaDAO;
import com.dp1.pucp.Ventas.DAO.PedidoProdDAO;
import com.dp1.pucp.Ventas.VIsta.MantPedidoProdGUI;
import com.dp1.pucp.Ventas.VIsta.PedidoProdGUI;
import com.dp1.pucp.Ventas.VIsta.PedidoProdPoliticaGUI;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;

/**
 *
 * @author Lucia
 */
public class MantPlanProdControlador {

    private PedidoProdDAO dao;
    private MantPlanProdGUI2 MantPlanProdGUI2;
    private ArrayList<String> listaEstado;
    private ArrayList<Pedidoproducto> listaPedidosProd;

    public MantPlanProdControlador(PedidoProdDAO dao, MantPlanProdGUI2 view) {
        this.dao = dao;
        this.MantPlanProdGUI2 = view;

        this.MantPlanProdGUI2.addNuevoListener(new crearPedidoProdListener());
        this.MantPlanProdGUI2.addBuscarListener(new buscarPedidoProdListener());
        this.MantPlanProdGUI2.addEditarListener(new editarPedidoProdListener());
        this.MantPlanProdGUI2.addEliminarListener(new eliminarPedidoProdListener());
        this.MantPlanProdGUI2.addLimpiarListener(new limpiarListener());
        ;
        this.llenarEstadoCombo();
        this.MantPlanProdGUI2.setSelectedIndexComboEstado(1); //para que busqye por defecto a las que estan registradas

    }

    class crearPedidoProdListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
        PedidoProdPoliticaGUI vista = new PedidoProdPoliticaGUI(MantPlanProdGUI2.getPadre(), true);
            PedidoProdPoliticaControlador c = new PedidoProdPoliticaControlador(dao, vista, null);
            LogDAO.insertarLog(MainController.usuario, "Ingresar Agregar Plan de Produccion");
            
            vista.setVisible(true);
        }
    }

    class buscarPedidoProdListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            int estado = MantPlanProdGUI2.getEstado();
            int codigo = MantPlanProdGUI2.getCodigo();
            listaPedidosProd = dao.listarPlanProd(estado, codigo);

          
            MantPlanProdGUI2.llenaGrilla(listaPedidosProd);
        }
    }

    public void llenarEstadoCombo() {
        listaEstado = dao.listarEstado();
        MantPlanProdGUI2.llenaComboEstado(listaEstado);

    }

    
    class limpiarListener implements  ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            
            int tam = listaPedidosProd.size();
            for (int i=0; i<tam; i++){
                listaPedidosProd.remove(0);
            }
            MantPlanProdGUI2.llenaGrilla(listaPedidosProd);
        }
        
    }
            
    class editarPedidoProdListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            int indice = MantPlanProdGUI2.getFilaSel();
            if (indice != -1) {
                PedidoProdPoliticaGUI pedidoProdPoliticaGUI = new PedidoProdPoliticaGUI(MantPlanProdGUI2.getPadre(), true);
                Pedidoproducto pedidoprod = listaPedidosProd.get(indice);
                PedidoProdPoliticaControlador c = new PedidoProdPoliticaControlador(dao, pedidoProdPoliticaGUI, pedidoprod);
                LogDAO.insertarLog(MainController.usuario, "Ingresar Editar Plan de Produccion");
            
                pedidoProdPoliticaGUI.setVisible(true);
            }
        }
    }

    class eliminarPedidoProdListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            String[] lista = {"Sí", "No"};
            int sel = MantPlanProdGUI2.getFilaSel();
            if (sel != 1) {
                Pedidoproducto pedidoproducto = new Pedidoproducto();
                pedidoproducto = listaPedidosProd.get(sel);
                if (pedidoproducto.getEstado() == 1) {
                    if (JOptionPane.showOptionDialog(MantPlanProdGUI2, "¿Desea cancelar este pedido de productos?",
                            "Cancelar Pedido de Producto", JOptionPane.YES_NO_OPTION, 0, null, lista, lista[1]) == 0) {

                        pedidoproducto.setEstado(0);
                        dao.guardarPedidoProd(pedidoproducto);
                        LogDAO.insertarLog(MainController.usuario, "Cancelar Pedido de Producto");
            
                        JOptionPane.showMessageDialog(MantPlanProdGUI2, "Se canceló el pedido de producto");
                        listaPedidosProd = dao.listarPedidoProdEstado(0);
                        MantPlanProdGUI2.llenaGrilla(listaPedidosProd);

                    }
                } else {
                    Validaciones.mostrarMensajeAvisoVal("No se puede cancelar el Pedido de Producto");
                }
            } else {
                Validaciones.mostrarMensajeAvisoVal("Debe seleccionar un Pedido de Producto.");
            }
        }
    }

    class porPoliticaListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            PedidoProdPoliticaGUI vista = new PedidoProdPoliticaGUI(MantPlanProdGUI2.getPadre(), true);
            PedidoProdPoliticaControlador c = new PedidoProdPoliticaControlador(dao, vista, null);
            vista.setVisible(true);
        }
    }

    class entregarListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            boolean hay=false;
            int sel = 0;
            sel = MantPlanProdGUI2.getFilaSel();
            if (sel == -1) {
                Validaciones.mostrarMensajeErrorVal("Debe seleccionar un pedido de producto.");
                return;
            } else {
                Pedidoproducto p = listaPedidosProd.get(sel);
                // verificar si ha sido cancelada
                ArrayList<Documentoventa> documentosventa = dao.listarDocVentas(0, 0);
                if (documentosventa.size() == 0) {
                    Validaciones.mostrarMensajeAvisoVal("El pedido de producto aún no tiene un documento de venta asociado");
                    return;
                }

                for (int i = 0; i < documentosventa.size(); i++) {
                    if (documentosventa.get(i).getPedidoproducto().getIdpedidoproducto() == p.getIdpedidoproducto()) { //El pedido tiene un docdeventa
                        hay = true;
                        if (documentosventa.get(i).getEstado() == 2) { //El pedido ha sido cancelado
                            if (p.getEstado() == 1) {
                                DocVentaDAO daodao = new DocVentaDAO();
                                Documentoventa d = documentosventa.get(i);
                                disminuirstock(d);
                                daodao.guardarDocVenta(d);
                            } else {
                                if (p.getEstado() == 0) {
                                    Validaciones.mostrarMensajeAvisoVal("El pedido esta cancelado por lo que no puede entregarse los productos.");
                                    return;
                                } else {
                                    Validaciones.mostrarMensajeAvisoVal("El pedido ya fue entregado al cliente anteriormente");
                                    return;
                                }
                            }
                        } else {
                            Validaciones.mostrarMensajeAvisoVal("El pedido de producto aun no ha sido cancelado por el cliente.");
                            return;
                        }
                    } //fin del if
                 


                } // fin del foru
                if (!hay){
                    Validaciones.mostrarMensajeErrorVal("El pedido aun no tiene un documento de venta asociado.");
                    return;
                }

            }//debe seleccionar un producto
        }
    }

    public void disminuirstock(Documentoventa d) {
        float stockactual, stocksaliente, stockfinal = 0f;
        int galletasxPresentacion = 0;
        int cantidadPresentaciones = 0;
        Presentacion presentacion;

        DocVentaDAO daodao = new DocVentaDAO();
        Pedidoproducto p = daodao.getPedidoProducto(d.getPedidoproducto().getIdpedidoproducto());
        ArrayList<Lineapedidoproducto> productos = daodao.listarLineasPedidosProd(p);
        for (int i = 0; i < productos.size(); i++) {
            //disminuye stock del producto

            Productofinal prodFinal = daodao.getProductoFinal(productos.get(i).getTipoproducto().getIdtipoproducto());


            stockactual = prodFinal.getCantidad();

            galletasxPresentacion = productos.get(i).getPresentacion().getCantidad();

            cantidadPresentaciones = (int) Math.round((productos.get(i).getCantidad()));

            stocksaliente = ((float) galletasxPresentacion) * ((float) cantidadPresentaciones);

            if (stocksaliente > stockactual) {
                Validaciones.mostrarMensajeAvisoVal("No hay suficiente stock para esta demanda");
                return;
            }
            stockfinal = stockactual - stocksaliente;

            prodFinal.setCantidad(stockfinal);

            daodao.guardarProductoFinal(prodFinal);

            // el kardex

            Tipoproducto tp = daodao.getTipoProducto(productos.get(i).getTipoproducto().getIdtipoproducto());

            Kardex k = new Kardex();
            k.setFecha(new Date());
            k.setHora(new Date());
            k.setEstado(1); // 1 indica que se realizo el movimiento
            k.setTipo("PF"); // 1 indica que se realizo el movimiento
            k.setCantidad((long) stocksaliente);
            k.setEntradasalida('S');
            k.setTipoproducto(tp);
            k.setAlmacen(prodFinal.getAlmacen());
            k.setMotivo("Salida por venta a cliente");
            daodao.guardarKardex(k);


        }
        Validaciones.mostrarMensajeAvisoVal("El pedido fue entregado al cliente.");
        p.setEstado(5); //finalizada y entregada
        dao.guardarPedidoProd(p);
        LogDAO.insertarLog(MainController.usuario, "Agregar Plan de Produccion");
            
    }
}
